// 得到一个合法字符的数组(数字 大小写字母 下划线)
var numList = [];
for (var i = 48; i <= 57; i++) {
  var char = String.fromCharCode(i); //根据编码返回对应的字符
  numList.push(char);
}
console.log(numList);

var smallList = [];
for (var i = 97; i <= 122; i++) {
  var char = String.fromCharCode(i); //根据编码返回对应的字符
  smallList.push(char);
}
console.log(smallList);

var bigList = [];
for (var i = 65; i <= 90; i++) {
  var char = String.fromCharCode(i); //根据编码返回对应的字符
  bigList.push(char);
}
console.log(bigList);

var speList = ["_"];// 允许使用的特殊字符的集合

var normalList = numList.concat(smallList, bigList, speList);
console.log(normalList);


function randCode (len) {
  len = len == undefined ? 4 : len;  //默认值(4)

  var list = numList.concat(smallList, bigList);
  var arr = [];
  for (var i = 0; i < len; i++) {  // 假如 i=2时 随机元素重复
    var index = Math.round(Math.random() * (list.length - 1));
    var item = list[index];
    if (arr.indexOf(item) == -1) {  // 不存在  => 放
      arr.push(item);   //把随机的元素放到数组中
    } else { // 存在   => 如果不做任何操作 会少放一次
      //  => 假如 i=2时 随机元素重复 i-- => i=1  本次循环结束  i++ => i=2 (忽略本次,再来一次)
      i--;  // i--   
    }
  }
  console.log(arr);

  return arr.join("");

}